package einlesenUndDatenverwaltung;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

/**
 * Die Klasse InputListenErzeuger ist die zentrale Logikklasse der
 * Einlesenseite. Sie nimmt im Konstruktor die Dateinamen entgegen und liest die
 * Dateien mithilfe der Methoden in der Klasse Datei ein. Weiterhin gibt sie
 * Kurs-, Buchungs- und Studentenlisten zurueck und man kann diese Listen
 * entsprechend setzen.
 * 
 * @author (Kerstin Schulze)
 * @version (17.1.2014)
 */
public class InputListenErzeuger {
	// Studenten-, Buchungs-, und Kursliste
	private StudentenListe sl;
	private BuchungsListe bl;
	private KursListe kl;
	// Zwischenspeicher fuer Objekte in Methode verarbeiteCsv
	ArrayList liste = new ArrayList();
	// Laenge der Listen, verhindert Abrauschen Programm beim Einlesen falscher
	// Listen
	private int zaehler;

	/**
	 * Konstruktor, zum Erzeugen von InputListener Objekten ohne Argumente.
	 * 
	 */
	public InputListenErzeuger() {

	}

	/**
	 * Methode zum Einlesen der Datei und zum Erzeugen der einzelnen Objekte und
	 * speichern in den entsprechenden Listen.
	 * 
	 * @param datName
	 *            (String) der Dateipfad aus dem FileChooser der GUI
	 * @param knopf
	 *            (String) Button der auf der GUI gewaehlt wurde
	 */
	public void ladeDatei(String datName, String knopf) {

		File file = new File(datName);

		if (!file.canRead() || !file.isFile())
			System.exit(0);

		BufferedReader in = null;
		try {
			// Erzeugen BufferedReader zum Einlesen
			in = new BufferedReader(new FileReader(datName));
			String zeile = null;
			// Datei zeilenweise einlesen
			while ((zeile = in.readLine()) != null) {
				System.out.println("Gelesene Zeile: " + zeile);
				// Verarbeiten der eingelesenen Zeile
				verarbeiteCsvLine(zeile, ",");

				// Erzeugen der Studentenobjekte und Bestuecken der Attribute
				// ueber Getter und
				// Hinzufuegen zu Studentenliste ueber die add-Methode
				if ((knopf.equals("button1")) && (zaehler == 6)) {
					try {
						Student stud = new Student();
						String matrikelnummer = (String) liste.get(0);
						stud.setMatrikelnummer(matrikelnummer);
						String name = (String) liste.get(1);
						stud.setName(name);
						String vorname = (String) liste.get(2);
						stud.setVorname(vorname);
						String universitaet = (String) liste.get(3);
						stud.setUniversitaet(universitaet);
						String wohnort = (String) liste.get(4);
						stud.setWohnort(wohnort);
						String istZ = (String) liste.get(5);
						stud.setIstZeitminimierer(istZ);
						sl.addElement(stud);
						System.out
								.println("Anzahl der Elemente in Studentenliste:"
										+ sl.anzStudenten());
						// Auffangen falsches Datenformat
					} catch (NumberFormatException e) {
						System.out.println("SYNTAXFEHLER");
					}

				}
				// Erzeugen der Buchungsobjekte und Bestuecken der Attribute
				// ueber
				// Setter und
				// Hinzufuegen zu Buchungsliste ueber die add-Methode
				if ((knopf.equals("button2")) && (zaehler == 3)) {
					try {
						Buchung buchung = new Buchung();
						String studentid = (String) liste.get(0);
						buchung.setStudent(studentid);
						String kursid = (String) liste.get(1);
						buchung.setKurs(kursid);
						String punkte = (String) liste.get(2);
						buchung.setPunkte(punkte);
						// nur einfuegen, wenn Studenten in Studenteliste bzw. Kurs in Kursliste
						if ((Integer.parseInt(studentid) <= 53)&&(Integer.parseInt(kursid) <= 28)) {
							bl.addElement(buchung);
						}
						System.out
								.println("Anzahl der Elemente in Buchungsliste:"
										+ bl.anzBuchungen());
						// Auffangen falsches Datenformat
					} catch (NumberFormatException e) {
						System.out.println("SYNTAXFEHLER");
					}

				}
				// Erzeugen der Kursobjekte und Bestuecken der Attribute ueber
				// Setter und
				// Hinzufuegen zu Kursliste ueber die add-Methode
				if ((knopf.equals("button3"))
						&& ((zaehler == 4) || (zaehler == 5) || (zaehler == 6))) {
					try {
						Kurs kurs = new Kurs();
						String kursid = (String) liste.get(0);
						kurs.setKursid(kursid);
						String kurzname = (String) liste.get(1);
						kurs.setKurzname(kurzname);
						String name = (String) liste.get(2);

						// Beseitigen der Probleme beim Einlesen von
						// Anfuehrungszeicheneintraege mit mehreren Kommas
						if (zaehler == 5) {
							// Umsetzen des Namens (Element an Stelle 2 und 3)
							name = name + "," + liste.get(3);
							// System.out.println("Bin drin in Integrierte-------------"+name);

							// Loeschen der Listenenelemente
							liste.remove(2);
							// String studienleistung_in=(String)liste.get(3);
							// System.out.println("Bin drin in Integrierte-------------"+studienleistung_in);

							// zaehler umsetzen fuer GUI Ausgabe
							zaehler = 4;

						} else if (zaehler == 6) {
							// Umsetzen des Namens (Element an Stelle 2, 3 und
							// 4)
							name = name + "," + liste.get(3) + ","
									+ liste.get(4);
							// System.out.println("Bin drin in Rechner-------------"+name);

							// Loeschen der Listenelemente
							liste.remove(2);
							liste.remove(2);
							// String studienleistung_in=(String)liste.get(3);
							// System.out.println("Bin drin in Rechner-------------"+studienleistung_in);

							// zaehler umsetzen fuer GUI Ausgabe
							zaehler = 4;
						}

						kurs.setName(name);
						String bewStud = (String) liste.get(3);
						kurs.setBewerteteStudienleistung(bewStud);
						kl.addElement(kurs);
						System.out.println("Anzahl der Elemente in Kursliste:"
								+ kl.anzKurse());
						// Auffangen falsches Datenformat
					} catch (NumberFormatException e) {
						System.out.println("SYNTAXFEHLER");
					}

				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (in != null)
				try {
					in.close();
				} catch (IOException e) {
				}
		}
	}

	/**
	 * Methode zum Verarbeiten eine einzelne Zeile der CSV-Datei.
	 * 
	 * @param data
	 *            (String) Eingabezeile
	 * @param trenner
	 *            (String) Trennzeichen in unserem Fall das Komma
	 */
	public void verarbeiteCsvLine(String data, String trenner) {
		System.out
				.println("--------------------------Methode verarbeiteCsvLine Neue Zeile:");
		StringTokenizer st = new StringTokenizer(data, trenner);
		int i = 0;
		while (st.hasMoreTokens()) {
			liste.add(i, st.nextToken());
			System.out.println("Liste an Stelle: " + i + " Wert: "
					+ liste.get(i) + " Arraylistenlaenge: " + liste.size());
			i++;

		}
		setZaehler(i++);
	}

	/**
	 * Methode zur Rueckgabe der Kursliste.
	 * 
	 * @return (KursListe)- ein Kurslistenobjekt
	 */
	public KursListe getKursListe() {
		return kl;
	}

	/**
	 * Methode zum Setzen der Kursliste. Muss im Steuerungscontroller erzeugt
	 * werden, damit mehrfaches Einlesen ueber den Filechooser moeglich ist.
	 * 
	 * @param in_kl
	 *            (KursListe) die zu setzende Kursliste
	 */
	public void setKursListe(KursListe in_kl) {
		this.kl = in_kl;
	}

	/**
	 * Methode zur Rueckgabe der StudentenListe.
	 * 
	 * @return (StudentenListe)- ein Studentenlistenobjekt
	 */
	public StudentenListe getStudentenListe() {
		return sl;
	}

	/**
	 * Methode zum Setzen der Studentenliste. Muss im Steuerungscontroller
	 * erzeugt werden, damit mehrfaches Einlesen ueber den Filechooser moeglich
	 * ist.
	 * 
	 * @param in_sl
	 *            (StudentenListe) die zu setzende Studentenliste
	 */
	public void setStudentenListe(StudentenListe in_sl) {
		this.sl = in_sl;
	}

	/**
	 * Methode zur Rueckgabe der BuchungsListe.
	 * 
	 * @return (BuchungsListe)- ein Buchungslistenobjekt
	 */
	public BuchungsListe getBuchungsListe() {
		return bl;
	}

	/**
	 * Methode zum Setzen der Buchungsliste. Muss im Steuerungscontroller
	 * erzeugt werden, damit mehrfaches Einlesen ueber den Filechooser moeglich
	 * ist.
	 * 
	 * @param in_bl
	 *            (BuchungsListe) die zu setzende Buchungsliste
	 */
	public void setBuchungsListe(BuchungsListe in_bl) {
		this.bl = in_bl;
	}

	/**
	 * Methode gibt den Zaehler zurueck, dieser zaehlt die Eintraege in der
	 * Zeile (6=Studentendatei, 4= Kursdatei, 3= Buchungsdatei).
	 * 
	 * @return zaehler (int) - die Groesse des Zaehlers
	 */
	public int getZaehler() {
		return zaehler;
	}

	/**
	 * Methode zum Setzen des Zaehlers. Zaehler wird zum Erkennen der jeweiligen
	 * Liste genutzt (6=Studentendatei, 4= Kursdatei, 3= Buchungsdatei).
	 * 
	 * @param zaehler
	 *            (int) der zu setzende Zaehler
	 */
	public void setZaehler(int zaehler) {
		this.zaehler = zaehler;
	}

}
